/*
 *    Copyright (c) 2018-2025, lengleng All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the pig4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: lengleng (wangiegie@gmail.com)
 */
package com.pig4cloud.pigx.shop.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.common.core.constant.enums.BooleanTypeEnum;
import com.pig4cloud.pigx.common.core.constant.enums.DeleteFlagEnum;
import com.pig4cloud.pigx.common.core.constant.enums.GoodsSpuTypeEnum;
import com.pig4cloud.pigx.shop.api.dto.GoodsSpuDTO;
import com.pig4cloud.pigx.shop.api.entity.*;
import com.pig4cloud.pigx.shop.api.vo.*;
import com.pig4cloud.pigx.shop.mapper.GoodsSpuMapper;
import com.pig4cloud.pigx.shop.service.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 商品表
 *
 * @author pig code generator
 * @date 2023-10-30 14:09:10
 */
@Slf4j
@Service
@AllArgsConstructor
public class GoodsSpuServiceImpl extends ServiceImpl<GoodsSpuMapper, GoodsSpu> implements GoodsSpuService {

	private final GoodsSkuService goodsSkuService;

	private final GoodsSkuSpecService goodsSkuSpecService;

	private final GoodsSkuGiftService goodsSkuGiftService;

	private final GoodsSpuSpecService goodsSpuSpecService;

	private final GoodsGiftService goodsGiftService;

	private final GoodsSpecService goodsSpecService;

	private final GoodsServerService goodsServerService;

	private final GoodsLabelService goodsLabelService;

	private final GoodsMaterialService materialService;

	/**
	 * 分页查询商品数据
	 * @param page
	 * @param goodsSpu
	 * @return
	 */
	@Override
	public IPage<GoodsSpuVO> pageList(Page page, GoodsSpu goodsSpu) {

		IPage<GoodsSpuVO> result = new Page<>();
		LambdaQueryWrapper<GoodsSpu> lqwGoodsSpu = new LambdaQueryWrapper<>();
		if (!StringUtils.isEmpty(goodsSpu.getSpuTitle())) {
			lqwGoodsSpu.like(GoodsSpu::getSpuTitle, goodsSpu.getSpuTitle());
		}
		lqwGoodsSpu.orderByDesc(GoodsSpu::getCreateTime);
		IPage<GoodsSpu> items = this.page(page, lqwGoodsSpu);
		if (items.getRecords().size() > 0) {
			List<Long> ids = new ArrayList<>();
			result = items.convert(u -> {
				GoodsSpuVO v = new GoodsSpuVO();
				BeanUtils.copyProperties(u, v);
				ids.add(u.getId());
				return v;
			});

			LambdaQueryWrapper<GoodsSku> lqwGoodsSku = new LambdaQueryWrapper<>();
			lqwGoodsSku.in(GoodsSku::getSpuId, ids);
			lqwGoodsSku.eq(GoodsSku::getDelFlag, DeleteFlagEnum.VALID.getType());
			List<GoodsSku> goodsSkus = goodsSkuService.list(lqwGoodsSku);
			result.getRecords().forEach(vo -> {
				List<GoodsSku> skus = goodsSkus.stream().filter(p -> p.getSpuId().longValue() == vo.getId().longValue())
						.collect(Collectors.toList());
				if (skus.size() > 0) {
					List<GoodsSkuVO> skuVOS = new ArrayList<>();
					skus.forEach(sku -> {
						GoodsSkuVO skuVO = new GoodsSkuVO();
						BeanUtils.copyProperties(sku, skuVO);
						skuVOS.add(skuVO);
					});
					vo.setSkus(skuVOS);
				}
			});
		}

		return result;
	}

	/**
	 * 获取所有商品列表
	 * @param goodsSpuDTO
	 * @return
	 */
	@Override
	public List<GoodsSpuVO> getList(GoodsSpuDTO goodsSpuDTO) {
		List<GoodsSpuVO> result = new ArrayList<>();

		LambdaQueryWrapper<GoodsSpu> lqwGoodsSpu = new LambdaQueryWrapper<>();
		lqwGoodsSpu.eq(GoodsSpu::getDelFlag, DeleteFlagEnum.VALID.getType());
		lqwGoodsSpu.eq(GoodsSpu::getStatus, BooleanTypeEnum.TRUE.getType());
		// 商品类别
		if (!StringUtils.isEmpty(goodsSpuDTO.getSpuType())) {
			lqwGoodsSpu.eq(GoodsSpu::getSpuType, goodsSpuDTO.getSpuType());
		}
		lqwGoodsSpu.orderBy(true, true, GoodsSpu::getSort);
		List<GoodsSpu> items = this.list(lqwGoodsSpu);

		if (items.size() > 0) {
			List<Long> ids = new ArrayList<>();
			items.forEach(u -> {
				GoodsSpuVO v = new GoodsSpuVO();
				BeanUtils.copyProperties(u, v);
				ids.add(v.getId());
				result.add(v);
			});

			LambdaQueryWrapper<GoodsSku> lqwGoodsSku = new LambdaQueryWrapper<>();
			lqwGoodsSku.in(GoodsSku::getSpuId, ids);
			lqwGoodsSku.eq(GoodsSku::getStatus, BooleanTypeEnum.TRUE.getType());
			lqwGoodsSku.eq(GoodsSku::getDelFlag, DeleteFlagEnum.VALID.getType());
			List<GoodsSku> goodsSkus = goodsSkuService.list(lqwGoodsSku);

			result.forEach(vo -> {
				List<GoodsSku> skus = goodsSkus.stream().filter(p -> p.getSpuId().longValue() == vo.getId().longValue())
						.collect(Collectors.toList());
				if (skus.size() > 0) {
					List<GoodsSkuVO> skuVOS = new ArrayList<>();
					skus.forEach(sku -> {
						GoodsSkuVO skuVO = new GoodsSkuVO();
						BeanUtils.copyProperties(sku, skuVO);
						if (!StringUtils.isEmpty(skuVO.getBannerImages())) {
							skuVO.setBannerImages(materialService.convertImageIdToUrl(skuVO.getBannerImages()));
						}
						if (!StringUtils.isEmpty(skuVO.getDetailImages())) {
							skuVO.setDetailImages(materialService.convertImageIdToUrl(skuVO.getDetailImages()));
						}

						skuVOS.add(skuVO);
					});
					vo.setSkus(skuVOS);
				}
			});
		}
		return result;
	}

	/**
	 * 添加商品
	 * @param goodsSpuVO
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean add(GoodsSpuVO goodsSpuVO, boolean isAddSpu) {
		Long spuId = goodsSpuVO.getId();
		if (isAddSpu) {
			// 获取需要添加的商品对象
			GoodsSpu goodsSpu = new GoodsSpu();
			BeanUtils.copyProperties(goodsSpuVO, goodsSpu);
			this.save(goodsSpu);
			spuId = goodsSpu.getId();
		}

		Long goodsSpuId = spuId;
		// 添加sku
		List<GoodsSku> skus = new ArrayList<>();
		goodsSpuVO.getSkus().forEach(item -> {
			item.setSpuId(goodsSpuId);
			GoodsSku sku = new GoodsSku();
			BeanUtils.copyProperties(item, sku);
			skus.add(sku);
		});
		if (skus.size() > 0) {
			goodsSkuService.saveOrUpdateBatch(skus);
			// 设置ID
			for (int i = 0; i < skus.size(); i++) {
				goodsSpuVO.getSkus().get(i).setId(skus.get(i).getId());
			}

		}

		// 添加sku规格列表
		List<GoodsSkuSpec> specs = new ArrayList<>();
		// 添加sku赠品列表
		List<GoodsSkuGift> gifts = new ArrayList<>();
		goodsSpuVO.getSkus().forEach(sku -> {
			sku.getSpecs().forEach(item -> {
				item.setSpuId(goodsSpuId);
				item.setSkuId(sku.getId());
				GoodsSkuSpec spec = new GoodsSkuSpec();
				BeanUtils.copyProperties(item, spec);
				specs.add(spec);
			});

			sku.getGifts().forEach(item -> {
				item.setSpuId(goodsSpuId);
				item.setSkuId(sku.getId());
				GoodsSkuGift gift = new GoodsSkuGift();
				BeanUtils.copyProperties(item, gift);
				gifts.add(gift);
			});
		});
		if (specs.size() > 0) {
			goodsSkuSpecService.saveOrUpdateBatch(specs);
		}
		if (gifts.size() > 0) {
			goodsSkuGiftService.saveOrUpdateBatch(gifts);
		}

		// 添加商品规格关系表
		List<GoodsSpuSpec> spuSpecs = new ArrayList<>();
		goodsSpuVO.getSpuSpec().forEach(item -> {
			item.setSpuId(goodsSpuId);
			GoodsSpuSpec spuSpec = new GoodsSpuSpecVO();
			BeanUtils.copyProperties(item, spuSpec);
			spuSpecs.add(spuSpec);
		});
		if (spuSpecs.size() > 0) {
			goodsSpuSpecService.saveOrUpdateBatch(spuSpecs);
		}

		return true;
	}

	/**
	 * 获取商品详情
	 * @param id
	 * @return
	 */
	@Override
	public GoodsSpuVO getGoodsById(Long id, Long skuId) {
		GoodsSpuVO result = new GoodsSpuVO();

		result.setSkus(new ArrayList<>());
		result.setSpuSpec(new ArrayList<>());
		// 获取商品信息
		GoodsSpu goodsSpu = this.getById(id);
		BeanUtils.copyProperties(goodsSpu, result);

		// 获取sku
		LambdaQueryWrapper<GoodsSku> lqwGoodsSku = new LambdaQueryWrapper<>();
		lqwGoodsSku.eq(GoodsSku::getSpuId, id);
		if (skuId != null) {
			lqwGoodsSku.eq(GoodsSku::getId, skuId);
		}
		lqwGoodsSku.eq(GoodsSku::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSku> goodsSkus = goodsSkuService.list(lqwGoodsSku);

		// 获取sku对应的规格
		LambdaQueryWrapper<GoodsSkuSpec> lqwGoodsSkuSpec = new LambdaQueryWrapper<>();
		lqwGoodsSkuSpec.eq(GoodsSkuSpec::getSpuId, id);
		if (skuId != null) {
			lqwGoodsSkuSpec.eq(GoodsSkuSpec::getSkuId, skuId);
		}
		// lqwGoodsSkuSpec.eq(GoodsSkuSpec::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSkuSpec> goodsSkuSpecs = goodsSkuSpecService.list(lqwGoodsSkuSpec);

		// 获取sku对应的礼品
		LambdaQueryWrapper<GoodsSkuGift> lqwGoodsSkuGift = new LambdaQueryWrapper<>();
		lqwGoodsSkuGift.eq(GoodsSkuGift::getSpuId, id);
		if (skuId != null) {
			lqwGoodsSkuGift.eq(GoodsSkuGift::getSkuId, skuId);
		}
		// lqwGoodsSkuGift.eq(GoodsSkuGift::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSkuGift> goodsSkuGifts = goodsSkuGiftService.list(lqwGoodsSkuGift);

		// 获取规格
		LambdaQueryWrapper<GoodsSpuSpec> lqwGoodsSpuSpec = new LambdaQueryWrapper<>();
		lqwGoodsSpuSpec.eq(GoodsSpuSpec::getSpuId, id);
		// lqwGoodsSpuSpec.eq(GoodsSpuSpec::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSpuSpec> goodsSpuSpecs = goodsSpuSpecService.list(lqwGoodsSpuSpec);

		List<Long> goodsSpecIds = new ArrayList<>();
		goodsSpuSpecs.forEach(spuSpec -> {
			GoodsSpuSpecVO goodsSpuSpecVO = new GoodsSpuSpecVO();
			BeanUtils.copyProperties(spuSpec, goodsSpuSpecVO);
			result.getSpuSpec().add(goodsSpuSpecVO);
			goodsSpecIds.add(spuSpec.getSpecId());
		});

		// 获取规格信息
		LambdaQueryWrapper<GoodsSpec> lqwGoodsSpec = new LambdaQueryWrapper<>();
		lqwGoodsSpec.in(GoodsSpec::getId, goodsSpecIds);
		lqwGoodsSpec.eq(GoodsSpec::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSpec> goodsSpecs = goodsSpecService.list(lqwGoodsSpec);
		result.getSpuSpec().forEach(item -> {
			Optional<GoodsSpec> goodsSpec = goodsSpecs.stream()
					.filter(p -> p.getId().longValue() == item.getSpecId().longValue()).findFirst();
			if (goodsSpec.isPresent()) {
				item.setValue(goodsSpec.get().getName());
			}
		});

		// 获取规格值列表
		lqwGoodsSpec = new LambdaQueryWrapper<>();
		lqwGoodsSpec.in(GoodsSpec::getSpecId, goodsSpecIds);
		lqwGoodsSpec.eq(GoodsSpec::getDelFlag, DeleteFlagEnum.VALID.getType());
		List<GoodsSpec> goodsSpecValues = goodsSpecService.list(lqwGoodsSpec);

		// 更新最新得规则值json串
		result.getSpuSpec().forEach(item -> {
			JSONArray array = JSON.parseArray(item.getLeaf());
			for (Object object : array) {
				JSONObject obj = (JSONObject) object;
				long specValueId = Long.parseLong(obj.get("id").toString());

				Optional<GoodsSpec> temp = goodsSpecValues.stream().filter(p -> p.getId() == specValueId).findFirst();
				if (temp.isPresent()) {
					obj.put("value", temp.get().getName());
				}
			}
			item.setLeaf(array.toJSONString());
		});

		goodsSkus.forEach(sku -> {
			GoodsSkuVO goodsSkuVO = new GoodsSkuVO();
			goodsSkuVO.setSpecs(new ArrayList<>());
			goodsSkuVO.setGifts(new ArrayList<>());
			BeanUtils.copyProperties(sku, goodsSkuVO);

			if (!StringUtils.isEmpty(goodsSkuVO.getBannerImages())) {
				goodsSkuVO.setBannerImages(materialService.convertImageIdToUrl(goodsSkuVO.getBannerImages()));
			}
			if (!StringUtils.isEmpty(goodsSkuVO.getDetailImages())) {
				goodsSkuVO.setDetailImages(materialService.convertImageIdToUrl(goodsSkuVO.getDetailImages()));
			}

			// 获取sku对应的类别列表
			List<GoodsSkuSpec> skuSpecList = goodsSkuSpecs.stream()
					.filter(p -> p.getSkuId().longValue() == sku.getId().longValue()).collect(Collectors.toList());
			skuSpecList.forEach(skuSpec -> {
				GoodsSkuSpecVO goodsSkuSpecVO = new GoodsSkuSpecVO();
				// 获取规格值
				Optional<GoodsSpec> goodsSpecValue = goodsSpecValues.stream()
						.filter(p -> p.getId().longValue() == skuSpec.getSpecValueId().longValue()).findFirst();
				if (goodsSpecValue.isPresent()) {
					goodsSkuSpecVO.setSpecValueName(goodsSpecValue.get().getName());
				}
				BeanUtils.copyProperties(skuSpec, goodsSkuSpecVO);
				goodsSkuVO.getSpecs().add(goodsSkuSpecVO);
			});

			// 存在礼品的场合
			if (goodsSkuGifts.size() > 0) {
				List<Long> giftIds = new ArrayList<>();
				// 获取sku对应的礼品列表
				List<GoodsSkuGift> skuGiftList = goodsSkuGifts.stream()
						.filter(p -> p.getSkuId().longValue() == sku.getId().longValue()).collect(Collectors.toList());
				skuGiftList.forEach(skuGift -> {
					GoodsSkuGiftVO goodsSkuGiftVO = new GoodsSkuGiftVO();
					BeanUtils.copyProperties(skuGift, goodsSkuGiftVO);
					// 转换图片
					if (!StringUtils.isEmpty(goodsSkuGiftVO.getCoverImage())) {
						goodsSkuGiftVO
								.setCoverImage(materialService.convertImageIdToUrl(goodsSkuGiftVO.getCoverImage()));
					}
					goodsSkuVO.getGifts().add(goodsSkuGiftVO);
					giftIds.add(skuGift.getGiftId());
				});

				// 存在礼品的场合
				if (giftIds.size() > 0) {
					// 获取礼品相关信息
					LambdaQueryWrapper<GoodsGift> lqwGoodsGift = new LambdaQueryWrapper<>();
					lqwGoodsGift.in(GoodsGift::getId, giftIds);
					lqwGoodsGift.eq(GoodsGift::getDelFlag, DeleteFlagEnum.VALID.getType());
					List<GoodsGift> goodsGifts = goodsGiftService.list(lqwGoodsGift);
					goodsSkuVO.getGifts().forEach(skuGift -> {
						Optional<GoodsGift> item = goodsGifts.stream()
								.filter(p -> p.getId().longValue() == skuGift.getGiftId().longValue()).findFirst();
						if (item.isPresent()) {
							// 设置赠品名称
							skuGift.setGiftName(item.get().getGiftName());
							// 设置赠品轮播图
							skuGift.setBannerImages(item.get().getBannerImages());
							if (!StringUtils.isEmpty(skuGift.getBannerImages())) {
								skuGift.setBannerImages(materialService.convertImageIdToUrl(skuGift.getBannerImages()));
							}
						}
					});
				}
			}
			result.getSkus().add(goodsSkuVO);
		});

		return result;
	}

	/**
	 * 获取简版商品sku信息
	 * @param id
	 * @param skuId
	 * @return
	 */
	@Override
	public GoodsSpuVO getSimpleSkuById(Long id, Long skuId) {
		GoodsSpuVO result = new GoodsSpuVO();
		result.setSkus(new ArrayList<>());
		// 获取spu
		GoodsSpu goodsSpu = this.getById(id);
		BeanUtils.copyProperties(goodsSpu, result);

		// 获取sku
		GoodsSkuVO skuVO = new GoodsSkuVO();
		GoodsSku sku = goodsSkuService.getById(skuId);
		BeanUtils.copyProperties(sku, skuVO);
		result.getSkus().add(skuVO);

		return result;
	}

	/**
	 * 删除商品
	 * @param id
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean deleteById(Long id, boolean isDelSpu) {
		if (isDelSpu) {
			// 删除商品
			this.removeById(id);
		}
		// 物理删除sku
		LambdaQueryWrapper<GoodsSku> lqwGoodsSku = new LambdaQueryWrapper<>();
		lqwGoodsSku.eq(GoodsSku::getSpuId, id);
		goodsSkuService.remove(lqwGoodsSku);

		// 物理删除sku对应的规格
		LambdaQueryWrapper<GoodsSkuSpec> lqwGoodsSkuSpec = new LambdaQueryWrapper<>();
		lqwGoodsSkuSpec.eq(GoodsSkuSpec::getSpuId, id);
		goodsSkuSpecService.remove(lqwGoodsSkuSpec);

		// 物理删除sku对应的礼品
		LambdaQueryWrapper<GoodsSkuGift> lqwGoodsSkuGift = new LambdaQueryWrapper<>();
		lqwGoodsSkuGift.eq(GoodsSkuGift::getSpuId, id);
		goodsSkuGiftService.remove(lqwGoodsSkuGift);

		// 物理删除spu和sku关系
		LambdaQueryWrapper<GoodsSpuSpec> lqwGoodsSpuSpec = new LambdaQueryWrapper<>();
		lqwGoodsSpuSpec.eq(GoodsSpuSpec::getSpuId, id);
		goodsSpuSpecService.remove(lqwGoodsSpuSpec);

		return true;
	}

	/**
	 * 更新数据
	 * @param goodsSpuVO
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean update(GoodsSpuVO goodsSpuVO) {
		// 更新商品SPU
		GoodsSpu goodsSpu = new GoodsSpu();
		BeanUtils.copyProperties(goodsSpuVO, goodsSpu);
		this.updateById(goodsSpu);

		// 商品spuId
		long spuId = goodsSpu.getId();
		// 删除
		deleteById(spuId, false);
		// 添加
		add(goodsSpuVO, false);
		return true;
	}

	/**
	 * 修改sku
	 * @param goodsSpuVO
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean updateSkuById(GoodsSpuVO goodsSpuVO) {
		if (goodsSpuVO.getSkus().size() <= 0) {
			return false;
		}
		GoodsSku sku = new GoodsSku();
		BeanUtils.copyProperties(goodsSpuVO.getSkus().get(0), sku);
		goodsSkuService.updateById(sku);

		// 删除sku对应礼品
		LambdaQueryWrapper<GoodsSkuGift> lqwGoodsSkuGift = new LambdaQueryWrapper<>();
		lqwGoodsSkuGift.eq(GoodsSkuGift::getSpuId, goodsSpuVO.getId());
		lqwGoodsSkuGift.eq(GoodsSkuGift::getSkuId, sku.getId());
		goodsSkuGiftService.remove(lqwGoodsSkuGift);

		List<GoodsSkuGift> gifts = new ArrayList<>();
		goodsSpuVO.getSkus().get(0).getGifts().forEach(item -> {
			item.setSpuId(goodsSpuVO.getId());
			item.setSkuId(sku.getId());
			GoodsSkuGift gift = new GoodsSkuGift();
			BeanUtils.copyProperties(item, gift);
			gifts.add(gift);
		});
		if (gifts.size() > 0) {
			goodsSkuGiftService.saveOrUpdateBatch(gifts);
		}
		return true;
	}

	/**
	 * 修改sku状态
	 * @param goodsSku
	 * @return
	 */
	@Override
	public boolean updateSkuStatusById(GoodsSku goodsSku) {
		return goodsSkuService.updateById(goodsSku);
	}

	/**
	 * 获取商品详情
	 * @param goodsSpuDTO
	 * @return
	 */
	@Override
	public GoodsSpuVO getGoodsSpuDetail(GoodsSpuDTO goodsSpuDTO) {
		GoodsSpuVO result = new GoodsSpuVO();

		LambdaQueryWrapper<GoodsSpu> lqwGoodsSpu = new LambdaQueryWrapper<>();
		lqwGoodsSpu.eq(GoodsSpu::getDelFlag, DeleteFlagEnum.VALID.getType());
		lqwGoodsSpu.eq(GoodsSpu::getStatus, BooleanTypeEnum.TRUE.getType());
		lqwGoodsSpu.eq(GoodsSpu::getId, goodsSpuDTO.getId());
		GoodsSpu goodsSpu = this.getOne(lqwGoodsSpu);
		if (goodsSpu != null) {
			BeanUtils.copyProperties(goodsSpu, result);

			// 获取服务列表
			String[] serviceIds = result.getGoodsServerIds().split(",");
			if (serviceIds.length > 0) {
				// result.setServers(new ArrayList<>());
				List<Long> ids = new ArrayList<>();
				for (String serviceId : serviceIds) {
					ids.add(Long.parseLong(serviceId));
				}
				LambdaQueryWrapper<GoodsServer> lqwGoodsServer = new LambdaQueryWrapper<>();
				lqwGoodsServer.in(GoodsServer::getId, ids);
				lqwGoodsServer.eq(GoodsServer::getDelFlag, DeleteFlagEnum.VALID.getType());
				List<GoodsServer> goodsServers = goodsServerService.list(lqwGoodsServer);
				result.setServers(goodsServers);
			}

			// 获取商品标签
			String[] labelIds = result.getGoodsLabelIds().split(",");
			if (labelIds.length > 0) {
				List<Long> ids = new ArrayList<>();
				for (String labelId : labelIds) {
					ids.add(Long.parseLong(labelId));
				}
				LambdaQueryWrapper<GoodsLabel> lqwGoodsLabel = new LambdaQueryWrapper<>();
				lqwGoodsLabel.in(GoodsLabel::getId, ids);
				lqwGoodsLabel.eq(GoodsLabel::getDelFlag, DeleteFlagEnum.VALID.getType());
				List<GoodsLabel> goodsLabels = goodsLabelService.list(lqwGoodsLabel);
				result.setLabels(goodsLabels);
			}

			// 获取规格列表
			result.setSpuSpec(new ArrayList<>());
			LambdaQueryWrapper<GoodsSpuSpec> lqwGoodsSpuSpec = new LambdaQueryWrapper<>();
			lqwGoodsSpuSpec.eq(GoodsSpuSpec::getSpuId, goodsSpuDTO.getId());
			lqwGoodsSpuSpec.eq(GoodsSpuSpec::getDelFlag, DeleteFlagEnum.VALID.getType());
			List<GoodsSpuSpec> spuSpecs = goodsSpuSpecService.list(lqwGoodsSpuSpec);
			spuSpecs.forEach(spec -> {
				GoodsSpuSpecVO vo = new GoodsSpuSpecVO();
				BeanUtils.copyProperties(spec, vo);

				// 获取规格名称
				LambdaQueryWrapper<GoodsSpec> lqwGoodsSpec = new LambdaQueryWrapper<>();
				lqwGoodsSpec.eq(GoodsSpec::getId, vo.getSpecId());
				GoodsSpec goodsSpec = goodsSpecService.getOne(lqwGoodsSpec);
				if (goodsSpec != null) {
					// 设置商品规格名字
					vo.setValue(goodsSpec.getName());
				}
				result.getSpuSpec().add(vo);
			});

			// 当前商品存在的场合, 查找所有商品对应的sku
			result.setSkus(new ArrayList<>());
			LambdaQueryWrapper<GoodsSku> lqwGoodsSku = new LambdaQueryWrapper<>();
			lqwGoodsSku.eq(GoodsSku::getSpuId, result.getId());
			lqwGoodsSku.eq(GoodsSku::getStatus, BooleanTypeEnum.TRUE.getType());
			lqwGoodsSku.eq(GoodsSku::getDelFlag, DeleteFlagEnum.VALID.getType());

			List<GoodsSku> goodsSkus = goodsSkuService.list(lqwGoodsSku);
			goodsSkus.forEach(sku -> {
				GoodsSkuVO vo = new GoodsSkuVO();
				BeanUtils.copyProperties(sku, vo);
				if (!StringUtils.isEmpty(vo.getBannerImages())) {
					vo.setBannerImages(materialService.convertImageIdToUrl(vo.getBannerImages()));
				}
				if (!StringUtils.isEmpty(vo.getDetailImages())) {
					vo.setDetailImages(materialService.convertImageIdToUrl(vo.getDetailImages()));
				}

				// 设置spu标题
				vo.setSpuTitle(goodsSpu.getSpuTitle());

				vo.setGifts(new ArrayList<>());
				// 获取sku对应的礼品信息
				LambdaQueryWrapper<GoodsSkuGift> lqwGoodsSkuGift = new LambdaQueryWrapper<>();
				lqwGoodsSkuGift.eq(GoodsSkuGift::getSkuId, vo.getId());
				lqwGoodsSkuGift.eq(GoodsSkuGift::getDelFlag, DeleteFlagEnum.VALID.getType());
				List<GoodsSkuGift> goodsSkuGifts = goodsSkuGiftService.list(lqwGoodsSkuGift);
				goodsSkuGifts.forEach(gift -> {
					GoodsSkuGiftVO giftVO = new GoodsSkuGiftVO();
					BeanUtils.copyProperties(gift, giftVO);

					// 赠品主图
					if (!StringUtils.isEmpty(giftVO.getCoverImage())) {
						giftVO.setCoverImage(materialService.convertImageIdToUrl(giftVO.getCoverImage()));
					}

					// 获取礼品详情
					LambdaQueryWrapper<GoodsGift> lqwGoodsGift = new LambdaQueryWrapper<>();
					lqwGoodsGift.eq(GoodsGift::getId, gift.getGiftId());
					GoodsGift goodsGift = goodsGiftService.getOne(lqwGoodsGift);
					giftVO.setGiftName(goodsGift.getGiftName());

					// 轮播图
					if (!StringUtils.isEmpty(goodsGift.getBannerImages())) {
						goodsGift.setBannerImages(materialService.convertImageIdToUrl(goodsGift.getBannerImages()));
					}
					giftVO.setBannerImages(goodsGift.getBannerImages());
					// 礼品详情图
					if (!StringUtils.isEmpty(goodsGift.getDetailImages())) {
						goodsGift.setDetailImages(materialService.convertImageIdToUrl(goodsGift.getDetailImages()));
					}
					giftVO.setDetailImages(goodsGift.getDetailImages());
					vo.getGifts().add(giftVO);
				});

				vo.setSpecs(new ArrayList<>());
				// 获取sku对应的规格
				LambdaQueryWrapper<GoodsSkuSpec> lqwGoodsSkuSpec = new LambdaQueryWrapper<>();
				lqwGoodsSkuSpec.eq(GoodsSkuSpec::getSpuId, goodsSpuDTO.getId());
				lqwGoodsSkuSpec.eq(GoodsSkuSpec::getSkuId, sku.getId());
				List<GoodsSkuSpec> goodsSkuSpecs = goodsSkuSpecService.list(lqwGoodsSkuSpec);
				goodsSkuSpecs.forEach(skuSpec -> {
					GoodsSkuSpecVO skuSpecVO = new GoodsSkuSpecVO();
					BeanUtils.copyProperties(skuSpec, skuSpecVO);

					List<Long> specIds = new ArrayList<>();
					specIds.add(skuSpecVO.getSpecId());
					specIds.add(skuSpecVO.getSpecValueId());

					// 获取规格名称
					LambdaQueryWrapper<GoodsSpec> lqwGoodsSpec = new LambdaQueryWrapper<>();
					lqwGoodsSpec.in(GoodsSpec::getId, specIds);
					List<GoodsSpec> goodsSpecs = goodsSpecService.list(lqwGoodsSpec);

					if (goodsSpecs.size() > 0) {
						// 设置商品规格名字
						Optional<GoodsSpec> goodsSpec = goodsSpecs.stream()
								.filter(p -> p.getId().longValue() == skuSpecVO.getSpecId().longValue()).findFirst();
						if (goodsSpec.isPresent()) {
							skuSpecVO.setSpecName(goodsSpec.get().getName());
						}
						// 设置规格值名称
						goodsSpec = goodsSpecs.stream()
								.filter(p -> p.getId().longValue() == skuSpecVO.getSpecValueId().longValue())
								.findFirst();
						if (goodsSpec.isPresent()) {
							skuSpecVO.setSpecValueName(goodsSpec.get().getName());
						}
					}

					vo.getSpecs().add(skuSpecVO);
				});
				result.getSkus().add(vo);
			});
		}

		return result;
	}

}
